“Baby Mental Life: Study 1” was conducted on MTurk on 2018-07-31 through 2018-08-01.

Our planned sample was 300 participants, and we anticipated that roughly 85-90% of recruited participants would pass all of our attention checks, so we initially recruited 342 participants (on the idea that ~87.5% of 342 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). After filtering out participants who failed at least one of our attention checks, we ended up retaining only 80% of participants, so we recruited an additional 36 participants for a total of 378 people recruited (on the idea that ~80% of 378 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). In a slight deviation from our preregistered recruitment plan, we limited these additional 36 participants to women, because we had an unexpectedly large imbalance of men to women.

UPDATE: On 2018-08-09, KW discovered that there were many repeating GPS locations, a symptom of a recent outbreak of bots on MTurk. As of 2019-05-15, these data INCLUDE participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics. Excluding these participants would exclude 76 participants (25%).

In the end, we ended up with a sample of 301 participants who passed our attention checks, 225 of whom came from unique GPS coordinates.

Each participant assessed children’s mental capacities at 3 target ages: newborns, 9-month-olds, and 5-year-olds. For each target, they rated 60 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable).

For more details about the study, see our preregistration here.

── Attaching packages ─────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.1.1     ✔ purrr   0.2.5
✔ tibble  2.1.1     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
package ‘ggplot2’ was built under R version 3.5.2package ‘tibble’ was built under R version 3.5.2── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

Attaching package: ‘langcog’

The following object is masked from ‘package:base’:

    scale


Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha

Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand

Data preparation

NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"
NAs introduced by coercion

EFA: all targets

Our primary analysis is an exploratory factor analysis (EFA) collapsing across all 3 target characters (and treating an individual participant’s responses to each character as if they were independent data points) - see the preregistration for more details.

We planned to examine three factor retention protocols in order to determine how many factors to retain: Parallel analysis, minimizing BIC, and a set of preset criteria outlined in Weisman et al. (2017). Here we look at each solution in turn.

Rotation choices

We planned to examine oblimin-rotated solutions (which allow factors to correlate), but you could examine other rotation options by selecting a different rotation type here.

Parallel analysis

How many factors to retain?

Parallel analysis suggests that the number of factors =  4  and the number of components =  3 
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 

 Eigen Values of 

What are these factors?

Loading required namespace: GPArotation
 A loading greater than abs(1) was detected.  Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?

Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):

Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target * factor + (target + factor | ResponseId)
   Data: efa_all_par_scores

REML criterion at convergence: 7036.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7531 -0.5165  0.0146  0.5656  3.1771 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                         
 ResponseId (Intercept) 0.29003  0.5385                                
            target.L    0.16960  0.4118   -0.26                        
            target.Q    0.01948  0.1396   -0.84  0.37                  
            factor1     0.20636  0.4543   -0.44 -0.52  0.19            
            factor2     0.29750  0.5454    0.26  0.68  0.11 -0.83      
            factor3     0.03002  0.1733   -0.17 -0.14  0.26  0.30  0.14
 Residual               0.22433  0.4736                                
Number of obs: 3612, groups:  ResponseId, 301

Fixed effects:
                   Estimate Std. Error t value
(Intercept)      -1.279e-15  3.203e-02   0.000
target.L          7.567e-01  2.738e-02  27.636
target.Q          5.780e-02  1.584e-02   3.648
factor1           1.350e-15  2.953e-02   0.000
factor2          -1.712e-15  3.427e-02   0.000
factor3          -3.760e-17  1.691e-02   0.000
target.L:factor1  3.775e-01  2.364e-02  15.966
target.Q:factor1  2.295e-01  2.364e-02   9.706
target.L:factor2 -3.939e-01  2.364e-02 -16.663
target.Q:factor2 -9.555e-02  2.364e-02  -4.041
target.L:factor3  2.949e-01  2.364e-02  12.474
target.Q:factor3 -2.535e-01  2.364e-02 -10.724

If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:

  • [(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
  • target.L: Overall, mental capacity attributions increase with target age.
  • target.Q: This increase is generally non-linear.
  • [factor1, factor2, …: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
  • target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
  • target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
  • target.L:factor2: The linear increase is less dramatic (shallower slope) for MR2, compared to other factors.
  • target.Q:factor2: The nonlinearity is less dramatic (flatter curve) for MR2, compared to other factors.
  • target.L:factor3: The linear increase is more dramatic (steeper slope) for MR3, compared to other factors.
  • target.Q:factor3: The nonlinearity is less dramatic (flatter curve) for MR3, compared to other factors.
Joining, by = "capacity"

|=====================================                 | 69% ~1 s remaining     
|=====================================                 | 70% ~1 s remaining     
|======================================                | 71% ~1 s remaining     
|=======================================               | 72% ~1 s remaining     
|=======================================               | 74% ~1 s remaining     
|========================================              | 75% ~1 s remaining     
|=========================================             | 76% ~1 s remaining     
|=========================================             | 77% ~1 s remaining     
|==========================================            | 78% ~1 s remaining     
|==========================================            | 79% ~1 s remaining     
|===========================================           | 81% ~1 s remaining     
|============================================          | 82% ~1 s remaining     
|=============================================         | 84% ~1 s remaining     
|==============================================        | 86% ~0 s remaining     
|===============================================       | 87% ~0 s remaining     
|===============================================       | 88% ~0 s remaining     
|================================================      | 90% ~0 s remaining     
|=================================================     | 91% ~0 s remaining     
|=================================================     | 92% ~0 s remaining     
|==================================================    | 93% ~0 s remaining     
|==================================================    | 94% ~0 s remaining     
|===================================================   | 96% ~0 s remaining     
|====================================================  | 97% ~0 s remaining     
|====================================================  | 98% ~0 s remaining     
|===================================================== | 98% ~0 s remaining     
|===================================================== | 99% ~0 s remaining     
|===================================================== | 99% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.94  with  1  factors
VSS complexity 2 achieves a maximimum of 0.99  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  6  factors 
BIC achieves a minimum of  -6013.88  with  6  factors
Sample Size adjusted BIC achieves a minimum of  -1658.73  with  8  factors

Statistics by number of factors 

What are these factors?

convergence not obtained in GPFoblq. 1000 iterations used. A loading greater than abs(1) was detected.  Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?

Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):

If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:

  • [(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
  • target.L: Overall, mental capacity attributions increase with target age.
  • target.Q: This increase is not generally non-linear.
  • [factor1, factor2, …: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
  • target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
  • target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
  • target.L:factor2: The linear increase is less dramatic (shallower slope) for MR2, compared to other factors.
  • target.Q:factor2: The nonlinearity for MR2 is comparable to other factors.
  • target.L:factor3: The linear increase is more dramatic (steeper slope) for MR3, compared to other factors.
  • target.Q:factor3: The nonlinearity is less dramatic (flatter curve) for MR3, compared to other factors.
  • target.L:factor4: The linear increase is less dramatic (shallower slope) for MR4, compared to other factors.
  • target.Q:factor4: The nonlinearity is more dramatic (curvier and/or concanve instead of convex curve) for MR4, compared to other factors.
  • target.L:factor5: The linear increase is more dramatic (steeper slope) for MR5, compared to other factors.
  • target.Q:factor5: The nonlinearity is less dramatic (flatter curve) for MR5, compared to other factors.
Joining, by = "capacity"

|===============================================       | 88% ~0 s remaining     
|================================================      | 91% ~0 s remaining     
|==================================================    | 93% ~0 s remaining     
|===================================================   | 95% ~0 s remaining     
|====================================================  | 98% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

How do these compare to parallel analysis?

Joining, by = "capacity"

Preset retention criteria

How many factors to retain?

[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to which targets?

Ignoring unknown aesthetics: y

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded with linear and quadratic contrasts, and factor is effect-coded for comparison with the grand mean (with the last factor as the base, -1):

unable to evaluate scaled gradientModel failed to converge: degenerate  Hessian with 1 negative eigenvalues
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target * factor + (target + factor | ResponseId)
   Data: efa_all_k_scores

REML criterion at convergence: 3395.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6194 -0.5160 -0.0066  0.5597  2.6303 

Random effects:
 Groups     Name        Variance Std.Dev. Corr             
 ResponseId (Intercept) 0.2968   0.5448                    
            target.L    0.2112   0.4595   -0.31            
            target.Q    0.0134   0.1158   -1.00  0.25      
            factor1     0.1565   0.3957   -0.37 -0.64  0.41
 Residual               0.1652   0.4065                    
Number of obs: 1806, groups:  ResponseId, 301

Fixed effects:
                   Estimate Std. Error t value
(Intercept)      -1.688e-16  3.283e-02   0.000
target.L          9.083e-01  3.124e-02  29.074
target.Q          3.140e-02  1.786e-02   1.758
factor1           1.392e-15  2.473e-02   0.000
target.L:factor1  2.596e-01  1.657e-02  15.671
target.Q:factor1  1.729e-01  1.657e-02  10.437
convergence code: 0
unable to evaluate scaled gradient
Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

There are some problems with this model that I haven’t addressed - see warnings above. Ignoring them for now…

If we consider t-values > 2 to be “significant” and use the plot above to guide our interpretation, here’s what we conclude:

  • [(Intercept): By definition, because we’re using factor scores, which are similar to z-scores, the intercept is ~0.]
  • target.L: Overall, mental capacity attributions increase with target age.
  • target.Q: This increase is generally non-linear.
  • [factor1: By definition, because we’re using factor scores, which are similar to z-scores, the differences in means across factors are ~0.]
  • target.L:factor1: The linear increase is more dramatic (steeper slope) for MR1, compared to other factors.
  • target.Q:factor1: The nonlinearity is more dramatic (curvier and/or concave instead of convex curve) for MR1, compared to other factors.
Joining, by = "capacity"

|================================================      | 89% ~0 s remaining     
|=================================================     | 92% ~0 s remaining     
|==================================================    | 94% ~0 s remaining     
|===================================================   | 96% ~0 s remaining     
|===================================================== | 98% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

How do these compare to parallel analysis?

Joining, by = "capacity"

EFA: newborns

What happens if we limit ourselves to assessments of newborns’ mental capacities?

Parallel analysis

How many factors to retain?

Parallel analysis suggests that the number of factors =  4  and the number of components =  3 
Call: fa.parallel(x = d_00mo, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 

 Eigen Values of 

What are these factors?

 A loading greater than abs(1) was detected.  Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86  with  1  factors
VSS complexity 2 achieves a maximimum of 0.98  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  4  factors 
BIC achieves a minimum of  -6124.8  with  4  factors
Sample Size adjusted BIC achieves a minimum of  -1385.1  with  8  factors

Statistics by number of factors 

What are these factors?

 A loading greater than abs(1) was detected.  Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to newborns?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 9-month-olds

What happens if we limit ourselves to assessments of 9-month-olds’ mental capacities?

Parallel analysis

How many factors to retain?

Parallel analysis suggests that the number of factors =  4  and the number of components =  2 
Call: fa.parallel(x = d_09mo, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 

 Eigen Values of 

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.86  with  1  factors
VSS complexity 2 achieves a maximimum of 0.98  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  6  factors 
BIC achieves a minimum of  -5996.91  with  4  factors
Sample Size adjusted BIC achieves a minimum of  -1366.77  with  8  factors

Statistics by number of factors 

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 9-month-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

EFA: 5-year-olds

What happens if we limit ourselves to assessments of 5-year-olds’ mental capacities?

Parallel analysis

How many factors to retain?

Parallel analysis suggests that the number of factors =  3  and the number of components =  2 
Call: fa.parallel(x = d_60mo, plot = F)
Parallel analysis suggests that the number of factors =  3  and the number of components =  2 

 Eigen Values of 

What are these factors?

 A loading greater than abs(1) was detected.  Examine the loadings carefully.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Minimizing BIC

How many factors to retain?


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.96  with  1  factors
VSS complexity 2 achieves a maximimum of 0.99  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  6  factors 
BIC achieves a minimum of  -4946.45  with  5  factors
Sample Size adjusted BIC achieves a minimum of  -470.82  with  8  factors

Statistics by number of factors 

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Preset retention criteria

How many factors to retain?

[1] "Preset criteria suggest retaining 2 factors"

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Which capacities are attributed to 5-year-olds?

Joining, by = "capacity"
Joining, by = c("capacity", "factor", "order")

Subset of capacities from Weisman et al. (2017)

Parallel analysis suggests that the number of factors =  3  and the number of components =  2 


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.91  with  1  factors
VSS complexity 2 achieves a maximimum of 0.99  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  3  factors 
BIC achieves a minimum of  -995.35  with  5  factors
Sample Size adjusted BIC achieves a minimum of  -249.51  with  8  factors

Statistics by number of factors 

[1] 2
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

Demographics

Joining, by = "ResponseId"

Joining, by = "ResponseId"

Joining, by = "ResponseId"

Joining, by = "ResponseId"

Joining, by = "ResponseId"

Save EFA output

Finally, I’ll export the 4-factor EFA results to a saved file that I can draw on in our Study 2 analyses.

LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMSIKZGF0ZTogMjAxOS0wNS0xNQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjY3LCBpbmNsdWRlID0gVCwgZWNobyA9IEYpCmBgYAoKIkJhYnkgTWVudGFsIExpZmU6IFN0dWR5IDEiIHdhcyBjb25kdWN0ZWQgb24gTVR1cmsgb24gMjAxOC0wNy0zMSB0aHJvdWdoIDIwMTgtMDgtMDEuCgpPdXIgcGxhbm5lZCBzYW1wbGUgd2FzIDMwMCBwYXJ0aWNpcGFudHMsIGFuZCB3ZSBhbnRpY2lwYXRlZCB0aGF0IHJvdWdobHkgODUtOTAlIG9mIHJlY3J1aXRlZCBwYXJ0aWNpcGFudHMgd291bGQgcGFzcyBhbGwgb2Ygb3VyIGF0dGVudGlvbiBjaGVja3MsIHNvIHdlIGluaXRpYWxseSByZWNydWl0ZWQgMzQyIHBhcnRpY2lwYW50cyAob24gdGhlIGlkZWEgdGhhdCB+ODcuNSUgb2YgMzQyIH4gMzAwIHBhcnRpY2lwYW50czsgbm90ZSB0aGF0IGZvciBhZG1pbmlzdHJhdGl2ZSBwdXJwb3NlcyB3ZSBuZWVkIHRvIHJlY3VpdCBwYXJ0aWNpcGFudHMgaW4gYmF0Y2hlcyB0aGF0IHdlcmUgZGl2aXNpYmxlIGJ5IDkpLiBBZnRlciBmaWx0ZXJpbmcgb3V0IHBhcnRpY2lwYW50cyB3aG8gZmFpbGVkIGF0IGxlYXN0IG9uZSBvZiBvdXIgYXR0ZW50aW9uIGNoZWNrcywgd2UgZW5kZWQgdXAgcmV0YWluaW5nIG9ubHkgODAlIG9mIHBhcnRpY2lwYW50cywgc28gd2UgcmVjcnVpdGVkIGFuIGFkZGl0aW9uYWwgMzYgcGFydGljaXBhbnRzIGZvciBhIHRvdGFsIG9mIDM3OCBwZW9wbGUgcmVjcnVpdGVkIChvbiB0aGUgaWRlYSB0aGF0IH44MCUgb2YgMzc4IH4gMzAwIHBhcnRpY2lwYW50czsgbm90ZSB0aGF0IGZvciBhZG1pbmlzdHJhdGl2ZSBwdXJwb3NlcyB3ZSBuZWVkIHRvIHJlY3VpdCBwYXJ0aWNpcGFudHMgaW4gYmF0Y2hlcyB0aGF0IHdlcmUgZGl2aXNpYmxlIGJ5IDkpLiBJbiBhIHNsaWdodCBkZXZpYXRpb24gZnJvbSBvdXIgcHJlcmVnaXN0ZXJlZCByZWNydWl0bWVudCBwbGFuLCB3ZSBsaW1pdGVkIHRoZXNlIGFkZGl0aW9uYWwgMzYgcGFydGljaXBhbnRzIHRvIHdvbWVuLCBiZWNhdXNlIHdlIGhhZCBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgaW1iYWxhbmNlIG9mIG1lbiB0byB3b21lbi4gCgoqKlVQREFURTogT24gMjAxOC0wOC0wOSwgS1cgZGlzY292ZXJlZCB0aGF0IHRoZXJlIHdlcmUgbWFueSByZXBlYXRpbmcgR1BTIGxvY2F0aW9ucywgYSBzeW1wdG9tIG9mIGEgcmVjZW50IG91dGJyZWFrIG9mIGJvdHMgb24gTVR1cmsuIEFzIG9mIDIwMTktMDUtMTUsIHRoZXNlIGRhdGEgX0lOQ0xVREVfIHBhcnRpY2lwYW50cyB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIHBhcnRpY2lwYW50IHdpdGggYW4gaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYXMgcmVjb3JkZWQgYnkgUXVhbHRyaWNzLiBFeGNsdWRpbmcgdGhlc2UgcGFydGljaXBhbnRzIHdvdWxkIGV4Y2x1ZGUgNzYgcGFydGljaXBhbnRzICgyNSUpLioqCgpJbiB0aGUgZW5kLCB3ZSBlbmRlZCB1cCB3aXRoIGEgc2FtcGxlIG9mIDMwMSBwYXJ0aWNpcGFudHMgd2hvIHBhc3NlZCBvdXIgYXR0ZW50aW9uIGNoZWNrcywgMjI1IG9mIHdob20gY2FtZSBmcm9tIHVuaXF1ZSBHUFMgY29vcmRpbmF0ZXMuCgpFYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXRpZXMgYXQgMyB0YXJnZXQgYWdlczogbmV3Ym9ybnMsIDktbW9udGgtb2xkcywgYW5kIDUteWVhci1vbGRzLiBGb3IgZWFjaCB0YXJnZXQsIHRoZXkgcmF0ZWQgNjAgbWVudGFsIGNhcGFjaXRpZXMgb24gYSBzY2FsZSBmcm9tIDAgKG5vdCBhdCBhbGwgY2FwYWJsZSkgdG8gMTAwIChjb21wbGV0ZWx5IGNhcGFibGUpLiAKCkZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHN0dWR5LCBzZWUgb3VyIHByZXJlZ2lzdHJhdGlvbiBbaGVyZV0oaHR0cHM6Ly9vc2YuaW8vZTZhamgvKS4gCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKCiMgc2V0IHRoZW1lIGZvciBnZ3Bsb3RzCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyfQojIHJ1biBzb3VyY2UgY29kZSAoZXh0cmEgaG9tZS1tYWRlIGZ1bmN0aW9ucykKc291cmNlKCIuL3NjcmlwdHMvbWF4X2ZhY3RvcnNfZWZhLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvcmV0ZW5fZnVuLlIiKQpgYGAKCgojIERhdGEgcHJlcGFyYXRpb24KCmBgYHtyfQojIGxvYWQgaW4gZGUtaWRlbnRpZmllZCByYXcgZGF0YQpkMCA8LSByZWFkLmNzdigiLi9kYXRhL2RlaWRlbnRpZmllZC9iYWJ5X21lbnRhbF9saWZlX3MxX2RhdGEuY3N2IikgJT4lIHNlbGVjdCgtWCkKYGBgCgpgYGB7cn0KIyBtYWtlIHF1ZXN0aW9uIGtleQpxdWVzdGlvbl9rZXkgPC0gZDBbMSxdICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJxdWVzdGlvbl9xdWFsdHJpY3MiKSAlPiUKICByZW5hbWUoInF1ZXN0aW9uX3RleHQiID0gWDEpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IHJlY29kZShxdWVzdGlvbl9xdWFsdHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdXJhdGlvbi4uaW4uc2Vjb25kcy4iID0gIkR1cmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyIiA9ICJBZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTMiID0gIkdlbmRlclNleCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRM18zX1RFWFQiID0gIkdlbmRlclNleF9maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTQiID0gIkVuZ2xpc2hQcm9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlE1IiA9ICJGaXJzdExhbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTVfMl9URVhUIiA9ICJGaXJzdExhbmdfZmlsbEluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlExOCIgPSAiUmFjZUV0aG5pY2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMThfMTBfVEVYVCIgPSAiUmFjZUV0aG5pY2l0eV9maWxsSW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTE5IiA9ICJFZHVjYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIwIiA9ICJJbmNvbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTIxIiA9ICJNYXJpdGFsU3RhdHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyMV82X1RFWFQiID0gIk1hcml0YWxTdGF0dXNfZmlsbEluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyMiIgPSAiSG91c2Vob2xkU2l6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjMiID0gIlBhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjUiID0gIkNoaWxkcmVuTnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNiIgPSAiQ2hpbGRyZW5Zb3VuZ2VzdEFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjZfMV9URVhUIiA9ICJDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI2XzJfVEVYVCIgPSAiQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyNyIgPSAiQ2hpbGRyZW5PbGRlc3RBZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUTI3XzFfVEVYVCIgPSAiQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJRMjdfMl9URVhUIiA9ICJDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyOCIgPSAiQXR0ZW50aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEyOSIgPSAiQ29tbWVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IHF1ZXN0aW9uX3F1YWx0cmljcyksCiAgICAgICAgIHF1ZXN0aW9uID0gY2FzZV93aGVuKGdyZXBsKCJ0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyIsIHF1ZXN0aW9uX3RleHQpIH4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJeLipleHRlbnQgaXMgYSAiLCAiIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gY2FzZV93aGVuKGdyZXBsKCJjYXBhYmxlIG9mLi4uIiwgcXVlc3Rpb25fdGV4dCkgfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoImNhcGFibGUgb2YuLi4gIiwgIiIsIHRvbG93ZXIocXVlc3Rpb24pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCIgIiwgIl8iLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigiJyIsICIiLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigibmV3Ym9ybl8tXyIsICJ0YXJnZXQwMG1vXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCI5LW1vbnRoLW9sZF8tXyIsICJ0YXJnZXQwOW1vXyIsIHF1ZXN0aW9uKSwKICAgICAgICAgcXVlc3Rpb24gPSBnc3ViKCI1LXllYXItb2xkXy1fIiwgInRhcmdldDYwbW9fIiwgcXVlc3Rpb24pKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCItIiwgIl8iLCBxdWVzdGlvbiksCiAgICAgICAgIHF1ZXN0aW9uID0gZ3N1YigiIFxcKGZvcl9leGFtcGxlLF9zbW9vdGgsX3JvdWdoXFwpIiwgIiIsIHF1ZXN0aW9uKSkKYGBgCgpgYGB7cn0KIyByZW5hbWUgcXVlc3Rpb25zCmQxIDwtIGQwICU+JQogICMgZ2V0IHJpZCBvZiBleHRyYSBpbmZvIGluIGZpcnN0IHR3byByb3dzICAKICBmaWx0ZXIoIWlzLm5hKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFEyKSkpKSAlPiUgCiAgZ2F0aGVyKHF1ZXN0aW9uX3F1YWx0cmljcywgcmVzcG9uc2UsIC1jKFJlc3BvbnNlSWQsIGR1cGxpY2F0ZUdQUykpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIHNlbGVjdChxdWVzdGlvbl9xdWFsdHJpY3MsIHF1ZXN0aW9uKSkgJT4lCiAgc2VsZWN0KC1xdWVzdGlvbl9xdWFsdHJpY3MpICU+JQogIHNwcmVhZChxdWVzdGlvbiwgcmVzcG9uc2UpCmBgYAoKYGBge3J9CiMgaW1wbGVtZW50IGluY2x1c2lvbi9leGNsdXNpb24gY3JpdGVyaWEKZDIgPC0gZDEgJT4lCiAgZmlsdGVyKEFnZSA+PSAxOCwgQWdlIDw9IDQ1LAogICAgICAgICBFbmdsaXNoUHJvZiAlaW4lIGMoIkFkdmFuY2VkIiwgIlN1cGVyaW9yIiksCiAgICAgICAgIGB0YXJnZXQwMG1vX3BsZWFzZV9zZWxlY3RfMzRgID09IDM0LAogICAgICAgICBgdGFyZ2V0MDltb19wbGVhc2Vfc2VsZWN0XzkwYCA9PSA5MCwKICAgICAgICAgYHRhcmdldDYwbW9fcGxlYXNlX3NlbGVjdF80YCA9PSA0LAogICAgICAgICBBdHRlbnRpb24gPT0gIlllcyIpCmBgYAoKYGBge3J9CiMgcmVtb3ZlIHBlb3BsZSB3aXRoIGFub3RoZXIgaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYW1vbmcgcGVvcGxlIHdobyBwYXNzZWQgYXR0ZW50aW9uIGNoZWNrcyBBUyBERVNJUkVECmQzIDwtIGQyICU+JQogICMgZmlsdGVyKGR1cGxpY2F0ZUdQUyA9PSBGKSAlPiUKICBzZWxlY3QoLWR1cGxpY2F0ZUdQUykKYGBgCgoKYGBge3J9CiMgcmVjb2RlIHZhcmlhYmxlcyAmIGRyb3AgZXh0cmFuZW91cyB2YXJpYWJsZXMKZDQgPC0gZDMgJT4lCiAgc2VsZWN0KC1jKEVuZERhdGUsIEZpbmlzaGVkLCAKICAgICAgICAgICAgcGF5bWVudCwgUHJvZ3Jlc3MsIAogICAgICAgICAgICBSZWNvcmRlZERhdGUsIFN0YXJ0RGF0ZSwgU3RhdHVzLCAKICAgICAgICAgICAgdGltZUVzdGltYXRlLCBVc2VyTGFuZ3VhZ2UpKSAlPiUKICBtdXRhdGVfYXQodmFycyhjKHN0YXJ0c193aXRoKCJ0YXJnZXQiKSwgQWdlLCBDaGlsZHJlbk51bWJlciwgCiAgICAgICAgICAgICAgICAgICBDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xLCBDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yLCAKICAgICAgICAgICAgICAgICAgIENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSwgQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yLAogICAgICAgICAgICAgICAgICAgRHVyYXRpb24sIEhvdXNlaG9sZFNpemUpKSwKICAgICAgICAgICAgZnVucyhhcy5udW1lcmljKC4pKSkgJT4lCiAgbXV0YXRlKEVkdWNhdGlvbiA9IGZhY3RvcihFZHVjYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyBzY2hvb2xpbmcgY29tcGxldGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdXJzZXJ5IHNjaG9vbCB0byA4dGggZ3JhZGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgaGlnaCBzY2hvb2wsIG5vIGRpcGxvbWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggc2Nob29sIGdyYWR1YXRlLCBkaXBsb21hIG9yIGVxdWl2YWxlbnQgKGluY2x1ZGluZyBHRUQpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIGNvbGxlZ2UgY3JlZGl0LCBubyBkZWdyZWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWRlIHNjaG9vbCwgdGVjaG5pY2FsIHNjaG9vbCwgb3Igdm9jYXRpb25hbCBzY2hvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzb2NpYXRlJ3MgZGVncmVlIChmb3IgZXhhbXBsZSwgQUEsIEFTKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNoZWxvcidzIGRlZ3JlZSAoZm9yIGV4YW1wbGUsIEJBLCBCUykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFzdGVyJ3MgZGVncmVlIChmb3IgZXhhbXBsZSwgTUEsIE1TKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N0b3Igb3IgcHJvZmVzc2lvbmFsIGRlZ3JlZSAoZm9yIGV4YW1wbGUsIFBoRCwgSkQsIE1ELCBNQkEpIikpLAogICAgICAgICBJbmNvbWUgPSBmYWN0b3IoSW5jb21lLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiJDUsMDAxIC0gMTUsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkMTUsMDAxIC0gMzAsMDAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkMzAsMDAxIC0gNjAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQ2MCwwMDEgLSA5MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJDkwLDAwMSAtIDE1MCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JlYXRlciB0aGFuICQxNTAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlciBub3QgdG8gc2F5IikpLAogICAgICAgICBQYXJlbnQgPSBmYWN0b3IoUGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpKQpgYGAKCmBgYHtyfQojIG1ha2UgdXNlZnVsIGRhdGFzZXRzCiMgZmluYWwgZGF0YXNldCB3aXRoIGFsbCBtZWFzdXJlZCB2YXJpYWJsZXMKZCA8LSBkNCAlPiUgZGlzdGluY3QoKQoKIyBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbgpkX2RlbW8gPC0gZCAlPiUgCiAgc2VsZWN0KFJlc3BvbnNlSWQsIER1cmF0aW9uLAogICAgICAgICBBZ2UsIHN0YXJ0c193aXRoKCJHZW5kZXJTZXgiKSwgc3RhcnRzX3dpdGgoIlJhY2VFdGhuaWNpdHkiKSwKICAgICAgICAgc3RhcnRzX3dpdGgoIkZpcnN0TGFuZyIpLAogICAgICAgICBFZHVjYXRpb24sIEluY29tZSwgSG91c2Vob2xkU2l6ZSwKICAgICAgICAgc3RhcnRzX3dpdGgoIk1hcml0YWxTdGF0dXMiKSwKICAgICAgICAgUGFyZW50LCBzdGFydHNfd2l0aCgiQ2hpbGRyZW4iKSwgCiAgICAgICAgIENvbW1lbnRzKSAlPiUKICBtdXRhdGUoUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSA9IGlmZWxzZShncmVwbCgiLChbQS1aYS16XSkiLCBSYWNlRXRobmljaXR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUiLCBSYWNlRXRobmljaXR5KSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlID0gY2FzZV93aGVuKAogICAgQ2hpbGRyZW5PbGRlc3RBZ2UgJWluJSBjKCJNeSBvbGRlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwgIk15IG9sZGVzdCBjaGlsZCBpcyBkZWNlYXNlZCIsICJQcmVmZXIgbm90IHRvIHNheSIpIH4gQ2hpbGRyZW5PbGRlc3RBZ2UsCiAgICBDaGlsZHJlbk9sZGVzdEFnZSA9PSAiSW4gbW9udGhzOiIgfiAKICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSkvMTIgPCAxLAogICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjEpLzEyIDwgMywgCiAgICAgICAgICAgICAgICAgICAgIjEgLSAzIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4xKS8xMiA8IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC0gMTAgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMSkvMTIgPCAxOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDE4IHllYXJzIikpKSkpLAogICAgQ2hpbGRyZW5PbGRlc3RBZ2UgPT0gIkluIHllYXJzOiIgfgogICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yKSA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5PbGRlc3RBZ2VfZmlsbEluMikgPCAzLCAKICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuT2xkZXN0QWdlX2ZpbGxJbjIpIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbk9sZGVzdEFnZV9maWxsSW4yKSA8IDE4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiKSkpKSksCiAgICBUUlVFIH4gIk5BIikpICU+JQogIG11dGF0ZShDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSA9IAogICAgICAgICAgIGZhY3RvcihDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTXkgb2xkZXN0IGNoaWxkIGhhcyBub3QgeWV0IGJlZW4gYm9ybiAoSSBhbS9teSBwYXJ0bmVyIGlzIHByZWduYW50KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIC0gNSB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIC0gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+IDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgb2xkZXN0IGNoaWxkIGlzIGRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZmVyIG5vdCB0byBzYXkiKSkpICU+JQogIG11dGF0ZShDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlID0gY2FzZV93aGVuKAogICAgQ2hpbGRyZW5Zb3VuZ2VzdEFnZSAlaW4lIGMoIk15IHlvdW5nZXN0IGNoaWxkIGhhcyBub3QgeWV0IGJlZW4gYm9ybiAoSSBhbS9teSBwYXJ0bmVyIGlzIHByZWduYW50KSIsICJNeSB5b3VuZ2VzdCBjaGlsZCBpcyBkZWNlYXNlZCIsICJQcmVmZXIgbm90IHRvIHNheSIpIH4gQ2hpbGRyZW5Zb3VuZ2VzdEFnZSwKICAgIENoaWxkcmVuWW91bmdlc3RBZ2UgPT0gIkluIG1vbnRoczoiIH4gCiAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCAxLAogICAgICAgICAgICAgIjwgMSB5ZWFyIiwKICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCAzLCAKICAgICAgICAgICAgICAgICAgICAiMSAtIDMgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5udW1lcmljKENoaWxkcmVuWW91bmdlc3RBZ2VfZmlsbEluMSkvMTIgPCA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC0gMTAgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4xKS8xMiA8IDE4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiKSkpKSksCiAgICBDaGlsZHJlbllvdW5nZXN0QWdlID09ICJJbiB5ZWFyczoiIH4KICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDEsCiAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDMsIAogICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFzLm51bWVyaWMoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9maWxsSW4yKSA8IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiMyAtIDUgeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLSAxMCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYXMubnVtZXJpYyhDaGlsZHJlbllvdW5nZXN0QWdlX2ZpbGxJbjIpIDwgMTgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCAtIDE4IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPiAxOCB5ZWFycyIpKSkpKSwKICAgIFRSVUUgfiAiTkEiKSkgJT4lCiAgbXV0YXRlKENoaWxkcmVuWW91bmdlc3RBZ2VfY29sbGFwc2UgPSAKICAgICAgICAgICBmYWN0b3IoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTXkgWW91bmdlc3QgY2hpbGQgaGFzIG5vdCB5ZXQgYmVlbiBib3JuIChJIGFtL215IHBhcnRuZXIgaXMgcHJlZ25hbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPCAxIHllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIC0gMyB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMgLSA1IHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAtIDEwIHllYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAgLSAxOCB5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj4gMTggeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBZb3VuZ2VzdCBjaGlsZCBpcyBkZWNlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlciBub3QgdG8gc2F5IikpKSAgCiMgYWxsIGFzc2Vzc21lbnRzIG9mIEFMTCBUQVJHRVRTLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfYWxsIDwtIGQgJT4lIAogIHNlbGVjdChSZXNwb25zZUlkLCBzdGFydHNfd2l0aCgidGFyZ2V0IiksIC1jb250YWlucygicGxlYXNlX3NlbGVjdCIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCAtUmVzcG9uc2VJZCkgJT4lCiAgbXV0YXRlKHRhcmdldCA9IGdzdWIoIl8uKiQiLCAiIiwgcXVlc3Rpb24pLAogICAgICAgICBjYXBhY2l0eSA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHF1ZXN0aW9uKSwKICAgICAgICAgc3ViaWQgPSBwYXN0ZShSZXNwb25zZUlkLCB0YXJnZXQsIHNlcCA9ICJfIikpICU+JQogIHNlbGVjdCgtUmVzcG9uc2VJZCwgLXF1ZXN0aW9uLCAtdGFyZ2V0KSAlPiUKICBzcHJlYWQoY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgYWxsIGFzc2Vzc21lbnRzIG9mIE5FV0JPUk5TLCBSZXBzb25zZUlkIGFzIHJvd25hbWVzCmRfMDBtbyA8LSBkX2FsbCAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZpbHRlcihncmVwbCgidGFyZ2V0MDBtbyIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigidGFyZ2V0Li5tb18iLCAiIiwgc3ViaWQpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgYWxsIGFzc2Vzc21lbnRzIG9mIDktTU9OVEgtT0xEUywgUmVwc29uc2VJZCBhcyByb3duYW1lcwpkXzA5bW8gPC0gZF9hbGwgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInRhcmdldDA5bW8iLCBzdWJpZCkpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHN1YmlkKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCgojIGFsbCBhc3Nlc3NtZW50cyBvZiA1LVlFQVItT0xEUywgUmVwc29uc2VJZCBhcyByb3duYW1lcwpkXzYwbW8gPC0gZF9hbGwgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmaWx0ZXIoZ3JlcGwoInRhcmdldDYwbW8iLCBzdWJpZCkpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoInRhcmdldC4ubW9fIiwgIiIsIHN1YmlkKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCmBgYAoKCiMgRUZBOiBhbGwgdGFyZ2V0cwoKT3VyIHByaW1hcnkgYW5hbHlzaXMgaXMgYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpIGNvbGxhcHNpbmcgYWNyb3NzIGFsbCAzIHRhcmdldCBjaGFyYWN0ZXJzIChhbmQgdHJlYXRpbmcgYW4gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudCdzIHJlc3BvbnNlcyB0byBlYWNoIGNoYXJhY3RlciBhcyBpZiB0aGV5IHdlcmUgaW5kZXBlbmRlbnQgZGF0YSBwb2ludHMpIC0gc2VlIHRoZSBwcmVyZWdpc3RyYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIAoKV2UgcGxhbm5lZCB0byBleGFtaW5lIHRocmVlIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGluIG9yZGVyIHRvIGRldGVybWluZSBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbjogUGFyYWxsZWwgYW5hbHlzaXMsIG1pbmltaXppbmcgQklDLCBhbmQgYSBzZXQgb2YgcHJlc2V0IGNyaXRlcmlhIG91dGxpbmVkIGluIFdlaXNtYW4gZXQgYWwuICgyMDE3KS4gSGVyZSB3ZSBsb29rIGF0IGVhY2ggc29sdXRpb24gaW4gdHVybi4KCiMjIFJvdGF0aW9uIGNob2ljZXMKCldlIHBsYW5uZWQgdG8gZXhhbWluZSBvYmxpbWluLXJvdGF0ZWQgc29sdXRpb25zICh3aGljaCBhbGxvdyBmYWN0b3JzIHRvIGNvcnJlbGF0ZSksIGJ1dCB5b3UgY291bGQgZXhhbWluZSBvdGhlciByb3RhdGlvbiBvcHRpb25zIGJ5IHNlbGVjdGluZyBhIGRpZmZlcmVudCByb3RhdGlvbiB0eXBlIGhlcmUuCgpgYGB7cn0KY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIgIyBwcmVyZWdpc3RlcmVkOiBmYWN0b3JzIGFsbG93ZWQgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAidmFyaW1heCIgIyBvcnRob2dvbmFsOiBmYWN0b3JzIGZvcmNlZCBub3QgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAibm9uZSIgIyBubyByb3RhdGlvbgpgYGAKCgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9QQSA8LSBmYS5wYXJhbGxlbChkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfUEEKcmV0ZW5fYWxsX3BhciA8LSByZXRlbl9hbGxfUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX3BhciA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSByZXRlbl9hbGxfcGFyLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNSwgaW5jbHVkZSA9IFR9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIlBhcmFsbGVsIEFuYWx5c2lzIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41LCBmaWcuYXNwID0gMS4yNSwgaW5jbHVkZSA9IEZ9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyLCBmYWN0b3JfbmFtZXMgPSBjKCJDb2duaXRpb24gYW5kIGNvbnRyb2wiLCAiQm9kaWx5IHNlbnNhdGlvbnMiLCAiU29jaWFsIGNvbm5lY3Rpb24iLCAiTmVnYXRpdmUgYWZmZWN0IikpICsgCiAgbGFicyh0aXRsZSA9ICJTdHVkeSAxOiBGYWN0b3IgbG9hZGluZ3MgZnJvbSBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgKEVGQSkiLAogICAgICAgc3VidGl0bGUgPSAiRm91ci1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCBhZnRlciBvYmxpcXVlIHRyYW5zZm9ybWF0aW9uIChvYmxpbWluKSIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojIGNyb3NzLWxvYWRpbmdzCmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGZpbHRlcihhYnMobG9hZGluZykgPiAwLjQpICU+JSAKICBjb3VudChjYXBhY2l0eSkgJT4lCiAgZmlsdGVyKG4gPiAxKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIGxlZnRfam9pbihlZmFfYWxsX3BhciRsb2FkaW5nc1tdICU+JQogICAgICAgICAgICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoYWJzKGxvYWRpbmcpID4gMC40KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUobG9hZGluZyA9IHJvdW5kKGxvYWRpbmcsIDMpKSAlPiUKICAgICAgICAgICAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSkgJT4lCiAgcmVuYW1lKENPRyA9IE1SMSwgQk9EID0gTVIyLCBQT1MgPSBNUjMsIE5FRyA9IE1SNCkKYGBgCgpgYGB7cn0KIyBpbnRlcmZhY3RvciBjb3JyZWxhdGlvbnMKZWZhX2FsbF9wYXIkUGhpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3RvckEiKSAlPiUKICBnYXRoZXIoZmFjdG9yQiwgcGhpLCAtZmFjdG9yQSkgJT4lCiAgYXJyYW5nZShkZXNjKHBoaSkpCmBgYAoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogICMgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICMgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICAjIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoYWJzKGxvYWRpbmcpID49IDAuNikgJT4lCiAgY291bnQoZmFjdG9yKQoKZWZhX2FsbF9wYXIkbG9hZGluZ3NbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogIHNlbGVjdChjYXBhY2l0eSwgTVI0KSAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKE1SNCkpKQpgYGAKCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBUfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCAoc3R1ZHkgMSkiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCkhlcmUncyBhIG11bHRpbGV2ZWwgbGluZWFyIHJlZ3Jlc3Npb24gb24gdGhlc2UgZmFjdG9yIHNjb3Jlcywgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIChmb3IgdGFyZ2V0IGFuZCBmYWN0b3IpIGJ5IHBhcnRpY2lwYW50LiBUYXJnZXQgaXMgY29kZWQgd2l0aCBsaW5lYXIgYW5kIHF1YWRyYXRpYyBjb250cmFzdHMsIGFuZCBmYWN0b3IgaXMgZWZmZWN0LWNvZGVkIGZvciBjb21wYXJpc29uIHdpdGggdGhlIGdyYW5kIG1lYW4gKHdpdGggdGhlIGxhc3QgZmFjdG9yIGFzIHRoZSBiYXNlLCAtMSk6CgpgYGB7ciwgaW5jbHVkZSA9IFR9CmVmYV9hbGxfcGFyX3Njb3JlcyA8LSBlZmFfYWxsX3BhciRzY29yZXNbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKICAgICAgICAgUmVzcG9uc2VJZCA9IGdzdWIoIl90YXJnZXQuKiQiLCAiIiwgc3ViaWQpKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRhcmdldCwgZmFjdG9yKSwgZnVucyhmYWN0b3IpKQoKY29udHJhc3RzKGVmYV9hbGxfcGFyX3Njb3JlcyR0YXJnZXQpIDwtIGNvbnRyLnBvbHkoMykKY29udHJhc3RzKGVmYV9hbGxfcGFyX3Njb3JlcyRmYWN0b3IpIDwtIGNvbnRyLnN1bShyZXRlbl9hbGxfcGFyKQoKcl9hbGxfcGFyIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXQgKiBmYWN0b3IgKyAodGFyZ2V0ICsgZmFjdG9yIHwgUmVzcG9uc2VJZCksCiAgICAgICAgICAgICAgICAgIGVmYV9hbGxfcGFyX3Njb3JlcykKc3VtbWFyeShyX2FsbF9wYXIsIGNvcnIgPSBGKQpgYGAKCklmIHdlIGNvbnNpZGVyIHQtdmFsdWVzID4gMiB0byBiZSAic2lnbmlmaWNhbnQiIGFuZCB1c2UgdGhlIHBsb3QgYWJvdmUgdG8gZ3VpZGUgb3VyIGludGVycHJldGF0aW9uLCBoZXJlJ3Mgd2hhdCB3ZSBjb25jbHVkZToKCi0gW2AoSW50ZXJjZXB0KWA6IEJ5IGRlZmluaXRpb24sIGJlY2F1c2Ugd2UncmUgdXNpbmcgZmFjdG9yIHNjb3Jlcywgd2hpY2ggYXJlIHNpbWlsYXIgdG8gei1zY29yZXMsIHRoZSBpbnRlcmNlcHQgaXMgfjAuXQotIGB0YXJnZXQuTGA6IE92ZXJhbGwsIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgaW5jcmVhc2Ugd2l0aCB0YXJnZXQgYWdlLgotIGB0YXJnZXQuUWA6IFRoaXMgaW5jcmVhc2UgaXMgZ2VuZXJhbGx5IG5vbi1saW5lYXIuCi0gW2BmYWN0b3IxYCwgYGZhY3RvcjJgLCAuLi46IEJ5IGRlZmluaXRpb24sIGJlY2F1c2Ugd2UncmUgdXNpbmcgZmFjdG9yIHNjb3Jlcywgd2hpY2ggYXJlIHNpbWlsYXIgdG8gei1zY29yZXMsIHRoZSBkaWZmZXJlbmNlcyBpbiBtZWFucyBhY3Jvc3MgZmFjdG9ycyBhcmUgfjAuXQotIGB0YXJnZXQuTDpmYWN0b3IxYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIxLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yMWA6IFRoZSBub25saW5lYXJpdHkgaXMgbW9yZSBkcmFtYXRpYyAoY3VydmllciBhbmQvb3IgY29uY2F2ZSBpbnN0ZWFkIG9mIGNvbnZleCBjdXJ2ZSkgZm9yIE1SMSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5MOmZhY3RvcjJgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIGxlc3MgZHJhbWF0aWMgKHNoYWxsb3dlciBzbG9wZSkgZm9yIE1SMiwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjJgOiBUaGUgbm9ubGluZWFyaXR5IGlzIGxlc3MgZHJhbWF0aWMgKGZsYXR0ZXIgY3VydmUpIGZvciBNUjIsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuTDpmYWN0b3IzYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIzLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yM2A6IFRoZSBub25saW5lYXJpdHkgaXMgbGVzcyBkcmFtYXRpYyAoZmxhdHRlciBjdXJ2ZSkgZm9yIE1SMywgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEsIGluY2x1ZGUgPSBUfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgoKIyMgTWluaW1pemluZyBCSUMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfdnNzIDwtIFZTUyhkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfdnNzCnJldGVuX2FsbF9iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl9hbGxfdnNzJHZzcy5zdGF0cyAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm5mYWN0b3JzIikgJT4lCiAgdG9wX24oLTEsIEJJQykgJT4lCiAgc2VsZWN0KG5mYWN0b3JzKSkkbmZhY3RvcnMgJT4lIGFzLm51bWVyaWMoKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfYmljIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9iaWMsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS41LCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhX2FsbF9iaWMpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiTWluaW1pemluZyBCSUMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IFR9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAxKSIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKSGVyZSdzIGEgbXVsdGlsZXZlbCBsaW5lYXIgcmVncmVzc2lvbiBvbiB0aGVzZSBmYWN0b3Igc2NvcmVzLCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgKGZvciB0YXJnZXQgYW5kIGZhY3RvcikgYnkgcGFydGljaXBhbnQuIFRhcmdldCBpcyBjb2RlZCB3aXRoIGxpbmVhciBhbmQgcXVhZHJhdGljIGNvbnRyYXN0cywgYW5kIGZhY3RvciBpcyBlZmZlY3QtY29kZWQgZm9yIGNvbXBhcmlzb24gd2l0aCB0aGUgZ3JhbmQgbWVhbiAod2l0aCB0aGUgbGFzdCBmYWN0b3IgYXMgdGhlIGJhc2UsIC0xKToKCmBgYHtyfQojIGVmYV9hbGxfYmljX3Njb3JlcyA8LSBlZmFfYWxsX2JpYyRzY29yZXNbXSAlPiUKIyAgIGRhdGEuZnJhbWUoKSAlPiUKIyAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKIyAgIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKIyAgICAgICAgICBSZXNwb25zZUlkID0gZ3N1YigiX3RhcmdldC4qJCIsICIiLCBzdWJpZCkpICU+JQojICAgc2VsZWN0KC1zdWJpZCkgJT4lCiMgICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQojICAgbXV0YXRlX2F0KHZhcnModGFyZ2V0LCBmYWN0b3IpLCBmdW5zKGZhY3RvcikpCiMgCiMgY29udHJhc3RzKGVmYV9hbGxfYmljX3Njb3JlcyR0YXJnZXQpIDwtIGNvbnRyLnBvbHkoMykKIyBjb250cmFzdHMoZWZhX2FsbF9iaWNfc2NvcmVzJGZhY3RvcikgPC0gY29udHIuc3VtKHJldGVuX2FsbF9iaWMpCiMgCiMgcl9hbGxfYmljIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXQgKiBmYWN0b3IgKyAodGFyZ2V0ICsgZmFjdG9yIHwgUmVzcG9uc2VJZCksCiMgICAgICAgICAgICAgICAgICAgZWZhX2FsbF9iaWNfc2NvcmVzLAojICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKIyBzdW1tYXJ5KHJfYWxsX2JpYywgY29yciA9IEYpCmBgYAoKSWYgd2UgY29uc2lkZXIgdC12YWx1ZXMgPiAyIHRvIGJlICJzaWduaWZpY2FudCIgYW5kIHVzZSB0aGUgcGxvdCBhYm92ZSB0byBndWlkZSBvdXIgaW50ZXJwcmV0YXRpb24sIGhlcmUncyB3aGF0IHdlIGNvbmNsdWRlOgoKLSBbYChJbnRlcmNlcHQpYDogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGludGVyY2VwdCBpcyB+MC5dCi0gYHRhcmdldC5MYDogT3ZlcmFsbCwgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbmNyZWFzZSB3aXRoIHRhcmdldCBhZ2UuCi0gYHRhcmdldC5RYDogVGhpcyBpbmNyZWFzZSBpcyAqbm90KiBnZW5lcmFsbHkgbm9uLWxpbmVhci4KLSBbYGZhY3RvcjFgLCBgZmFjdG9yMmAsIC4uLjogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGRpZmZlcmVuY2VzIGluIG1lYW5zIGFjcm9zcyBmYWN0b3JzIGFyZSB+MC5dCi0gYHRhcmdldC5MOmZhY3RvcjFgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIG1vcmUgZHJhbWF0aWMgKHN0ZWVwZXIgc2xvcGUpIGZvciBNUjEsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuUTpmYWN0b3IxYDogVGhlIG5vbmxpbmVhcml0eSBpcyBtb3JlIGRyYW1hdGljIChjdXJ2aWVyIGFuZC9vciBjb25jYXZlIGluc3RlYWQgb2YgY29udmV4IGN1cnZlKSBmb3IgTVIxLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0Lkw6ZmFjdG9yMmA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbGVzcyBkcmFtYXRpYyAoc2hhbGxvd2VyIHNsb3BlKSBmb3IgTVIyLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yMmA6IFRoZSBub25saW5lYXJpdHkgZm9yIE1SMiBpcyBjb21wYXJhYmxlIHRvIG90aGVyIGZhY3RvcnMuIAotIGB0YXJnZXQuTDpmYWN0b3IzYDogVGhlIGxpbmVhciBpbmNyZWFzZSBpcyBtb3JlIGRyYW1hdGljIChzdGVlcGVyIHNsb3BlKSBmb3IgTVIzLCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0LlE6ZmFjdG9yM2A6IFRoZSBub25saW5lYXJpdHkgaXMgbGVzcyBkcmFtYXRpYyAoZmxhdHRlciBjdXJ2ZSkgZm9yIE1SMywgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5MOmZhY3RvcjRgOiBUaGUgbGluZWFyIGluY3JlYXNlIGlzIGxlc3MgZHJhbWF0aWMgKHNoYWxsb3dlciBzbG9wZSkgZm9yIE1SNCwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjRgOiBUaGUgbm9ubGluZWFyaXR5IGlzIG1vcmUgZHJhbWF0aWMgKGN1cnZpZXIgYW5kL29yIGNvbmNhbnZlIGluc3RlYWQgb2YgY29udmV4IGN1cnZlKSBmb3IgTVI0LCBjb21wYXJlZCB0byBvdGhlciBmYWN0b3JzLiAKLSBgdGFyZ2V0Lkw6ZmFjdG9yNWA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbW9yZSBkcmFtYXRpYyAoc3RlZXBlciBzbG9wZSkgZm9yIE1SNSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjVgOiBUaGUgbm9ubGluZWFyaXR5IGlzIGxlc3MgZHJhbWF0aWMgKGZsYXR0ZXIgY3VydmUpIGZvciBNUjUsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLCBpbmNsdWRlID0gVH0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKIyMjIEhvdyBkbyB0aGVzZSBjb21wYXJlIHRvIHBhcmFsbGVsIGFuYWx5c2lzPwoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHJlbmFtZShwYXJfZmFjdG9yID0gZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZWZhX2FsbF9iaWMkbG9hZGluZ3NbXSAlPiUKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKGtfZmFjdG9yID0gZmFjdG9yKSkgJT4lCiAgY291bnQocGFyX2ZhY3Rvciwga19mYWN0b3IpICU+JQogIHNwcmVhZChrX2ZhY3RvciwgbikKYGBgCgojIyBQcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX2sgPC0gcmV0ZW5fZnVuKGRfYWxsLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCnByaW50KHBhc3RlKCJQcmVzZXQgY3JpdGVyaWEgc3VnZ2VzdCByZXRhaW5pbmciLCByZXRlbl9hbGxfaywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX2sgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2ssIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41LCBpbmNsdWRlID0gVH0KaGVhdG1hcF9mdW4oZWZhX2FsbF9rKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIlByZXNldCBjcml0ZXJpYSAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBpbmNsdWRlID0gVH0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAxKSIpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgpIZXJlJ3MgYSBtdWx0aWxldmVsIGxpbmVhciByZWdyZXNzaW9uIG9uIHRoZXNlIGZhY3RvciBzY29yZXMsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyAoZm9yIHRhcmdldCBhbmQgZmFjdG9yKSBieSBwYXJ0aWNpcGFudC4gVGFyZ2V0IGlzIGNvZGVkIHdpdGggbGluZWFyIGFuZCBxdWFkcmF0aWMgY29udHJhc3RzLCBhbmQgZmFjdG9yIGlzIGVmZmVjdC1jb2RlZCBmb3IgY29tcGFyaXNvbiB3aXRoIHRoZSBncmFuZCBtZWFuICh3aXRoIHRoZSBsYXN0IGZhY3RvciBhcyB0aGUgYmFzZSwgLTEpOgoKYGBge3IsIGluY2x1ZGUgPSBUfQplZmFfYWxsX2tfc2NvcmVzIDwtIGVmYV9hbGxfayRzY29yZXNbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIG11dGF0ZSh0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKICAgICAgICAgUmVzcG9uc2VJZCA9IGdzdWIoIl90YXJnZXQuKiQiLCAiIiwgc3ViaWQpKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLXRhcmdldCwgLVJlc3BvbnNlSWQpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRhcmdldCwgZmFjdG9yKSwgZnVucyhmYWN0b3IpKQoKY29udHJhc3RzKGVmYV9hbGxfa19zY29yZXMkdGFyZ2V0KSA8LSBjb250ci5wb2x5KDMpCmNvbnRyYXN0cyhlZmFfYWxsX2tfc2NvcmVzJGZhY3RvcikgPC0gY29udHIuc3VtKHJldGVuX2FsbF9rKQoKcl9hbGxfayA8LSBsbWVyKHNjb3JlIH4gdGFyZ2V0ICogZmFjdG9yICsgKHRhcmdldCArIGZhY3RvciB8IFJlc3BvbnNlSWQpLAogICAgICAgICAgICAgICAgZWZhX2FsbF9rX3Njb3JlcykKc3VtbWFyeShyX2FsbF9rLCBjb3JyID0gRikKYGBgCgoqKlRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggdGhpcyBtb2RlbCB0aGF0IEkgaGF2ZW4ndCBhZGRyZXNzZWQqKiAtIHNlZSB3YXJuaW5ncyBhYm92ZS4gSWdub3JpbmcgdGhlbSBmb3Igbm93Li4uIAoKSWYgd2UgY29uc2lkZXIgdC12YWx1ZXMgPiAyIHRvIGJlICJzaWduaWZpY2FudCIgYW5kIHVzZSB0aGUgcGxvdCBhYm92ZSB0byBndWlkZSBvdXIgaW50ZXJwcmV0YXRpb24sIGhlcmUncyB3aGF0IHdlIGNvbmNsdWRlOgoKLSBbYChJbnRlcmNlcHQpYDogQnkgZGVmaW5pdGlvbiwgYmVjYXVzZSB3ZSdyZSB1c2luZyBmYWN0b3Igc2NvcmVzLCB3aGljaCBhcmUgc2ltaWxhciB0byB6LXNjb3JlcywgdGhlIGludGVyY2VwdCBpcyB+MC5dCi0gYHRhcmdldC5MYDogT3ZlcmFsbCwgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBpbmNyZWFzZSB3aXRoIHRhcmdldCBhZ2UuCi0gYHRhcmdldC5RYDogVGhpcyBpbmNyZWFzZSBpcyBnZW5lcmFsbHkgbm9uLWxpbmVhci4KLSBbYGZhY3RvcjFgOiBCeSBkZWZpbml0aW9uLCBiZWNhdXNlIHdlJ3JlIHVzaW5nIGZhY3RvciBzY29yZXMsIHdoaWNoIGFyZSBzaW1pbGFyIHRvIHotc2NvcmVzLCB0aGUgZGlmZmVyZW5jZXMgaW4gbWVhbnMgYWNyb3NzIGZhY3RvcnMgYXJlIH4wLl0KLSBgdGFyZ2V0Lkw6ZmFjdG9yMWA6IFRoZSBsaW5lYXIgaW5jcmVhc2UgaXMgbW9yZSBkcmFtYXRpYyAoc3RlZXBlciBzbG9wZSkgZm9yIE1SMSwgY29tcGFyZWQgdG8gb3RoZXIgZmFjdG9ycy4gCi0gYHRhcmdldC5ROmZhY3RvcjFgOiBUaGUgbm9ubGluZWFyaXR5IGlzIG1vcmUgZHJhbWF0aWMgKGN1cnZpZXIgYW5kL29yIGNvbmNhdmUgaW5zdGVhZCBvZiBjb252ZXggY3VydmUpIGZvciBNUjEsIGNvbXBhcmVkIHRvIG90aGVyIGZhY3RvcnMuIAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLCBpbmNsdWRlID0gVH0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2ssIHRhcmdldCA9ICJhbGwiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKIyMjIEhvdyBkbyB0aGVzZSBjb21wYXJlIHRvIHBhcmFsbGVsIGFuYWx5c2lzPwoKYGBge3J9CmVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHJlbmFtZShwYXJfZmFjdG9yID0gZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZWZhX2FsbF9rJGxvYWRpbmdzW10gJT4lCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICAgICAgICAgICAgICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICAgICAgICAgICAgICB0b3BfbigxLCBhYnMobG9hZGluZykpICU+JQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLWxvYWRpbmcpICU+JQogICAgICAgICAgICAgIHJlbmFtZShrX2ZhY3RvciA9IGZhY3RvcikpICU+JQogIGNvdW50KHBhcl9mYWN0b3IsIGtfZmFjdG9yKSAlPiUKICBzcHJlYWQoa19mYWN0b3IsIG4pCmBgYAoKCiMgRUZBOiBuZXdib3JucwoKV2hhdCBoYXBwZW5zIGlmIHdlIGxpbWl0IG91cnNlbHZlcyB0byBhc3Nlc3NtZW50cyBvZiBuZXdib3JucycgbWVudGFsIGNhcGFjaXRpZXM/CgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzAwbW9fUEEgPC0gZmEucGFyYWxsZWwoZF8wMG1vLCBwbG90ID0gRik7IHJldGVuXzAwbW9fUEEKcmV0ZW5fMDBtb19wYXIgPC0gcmV0ZW5fMDBtb19QQSRuZmFjdApgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wMG1vX3BhciA8LSBmYShkXzAwbW8sIG5mYWN0b3JzID0gcmV0ZW5fMDBtb19wYXIsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41fQpoZWF0bWFwX2Z1bihlZmFfMDBtb19wYXIpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUGFyYWxsZWwgQW5hbHlzaXMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIG5ld2Jvcm5zPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzAwbW9fcGFyLCB0YXJnZXQgPSAibmV3Ym9ybnMiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzAwbW9fdnNzIDwtIFZTUyhkXzAwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fMDBtb192c3MKcmV0ZW5fMDBtb19iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl8wMG1vX3ZzcyR2c3Muc3RhdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJuZmFjdG9ycyIpICU+JQogIHRvcF9uKC0xLCBCSUMpICU+JQogIHNlbGVjdChuZmFjdG9ycykpJG5mYWN0b3JzICU+JSBhcy5udW1lcmljKCkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDBtb19iaWMgPC0gZmEoZF8wMG1vLCBuZmFjdG9ycyA9IHJldGVuXzAwbW9fYmljLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wMG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJNaW5pbWl6aW5nIEJJQyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gbmV3Ym9ybnM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDBtb19iaWMsIHRhcmdldCA9ICJuZXdib3JucyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wMG1vX2sgPC0gcmV0ZW5fZnVuKGRfMDBtbywgcm90X3R5cGUgPSBjaG9zZW5fcm90KQpwcmludChwYXN0ZSgiUHJlc2V0IGNyaXRlcmlhIHN1Z2dlc3QgcmV0YWluaW5nIiwgcmV0ZW5fMDBtb19rLCAiZmFjdG9ycyIpKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wMG1vX2sgPC0gZmEoZF8wMG1vLCBuZmFjdG9ycyA9IHJldGVuXzAwbW9faywgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzAwbW9faykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQcmVzZXQgY3JpdGVyaWEgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIG5ld2Jvcm5zPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzAwbW9faywgdGFyZ2V0ID0gIm5ld2Jvcm5zIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IDktbW9udGgtb2xkcwoKV2hhdCBoYXBwZW5zIGlmIHdlIGxpbWl0IG91cnNlbHZlcyB0byBhc3Nlc3NtZW50cyBvZiA5LW1vbnRoLW9sZHMnIG1lbnRhbCBjYXBhY2l0aWVzPwoKIyMgUGFyYWxsZWwgYW5hbHlzaXMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl8wOW1vX1BBIDwtIGZhLnBhcmFsbGVsKGRfMDltbywgcGxvdCA9IEYpOyByZXRlbl8wOW1vX1BBCnJldGVuXzA5bW9fcGFyIDwtIHJldGVuXzA5bW9fUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDltb19wYXIgPC0gZmEoZF8wOW1vLCBuZmFjdG9ycyA9IHJldGVuXzA5bW9fcGFyLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wOW1vX3BhcikgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQYXJhbGxlbCBhbmFseXNpcyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDktbW9udGgtb2xkcz8KCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAyfQppdGVtc3Bsb3RfZnVuKGVmYV8wOW1vX3BhciwgdGFyZ2V0ID0gIjktbW9udGgtb2xkcyIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKCiMjIE1pbmltaXppbmcgQklDCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fMDltb192c3MgPC0gVlNTKGRfMDltbywgcGxvdCA9IEYpOyByZXRlbl8wOW1vX3ZzcwpyZXRlbl8wOW1vX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuXzA5bW9fdnNzJHZzcy5zdGF0cyAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm5mYWN0b3JzIikgJT4lCiAgdG9wX24oLTEsIEJJQykgJT4lCiAgc2VsZWN0KG5mYWN0b3JzKSkkbmZhY3RvcnMgJT4lIGFzLm51bWVyaWMoKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV8wOW1vX2JpYyA8LSBmYShkXzA5bW8sIG5mYWN0b3JzID0gcmV0ZW5fMDltb19iaWMsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzA5bW9fYmljKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk1pbmltaXppbmcgQklDIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA5LW1vbnRoLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDltb19iaWMsIHRhcmdldCA9ICI5LW1vbnRoLW9sZHMiKSArIAogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCgojIyBQcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fMDltb19rIDwtIHJldGVuX2Z1bihkXzA5bW8sIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKcHJpbnQocGFzdGUoIlByZXNldCBjcml0ZXJpYSBzdWdnZXN0IHJldGFpbmluZyIsIHJldGVuXzA5bW9faywgImZhY3RvcnMiKSkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfMDltb19rIDwtIGZhKGRfMDltbywgbmZhY3RvcnMgPSByZXRlbl8wOW1vX2ssIHJvdGF0ZSA9IGNob3Nlbl9yb3QsCiAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV8wOW1vX2spICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUHJlc2V0IGNyaXRlcmlhIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byA5LW1vbnRoLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfMDltb19rLCB0YXJnZXQgPSAiOS1tb250aC1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBFRkE6IDUteWVhci1vbGRzCgpXaGF0IGhhcHBlbnMgaWYgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIGFzc2Vzc21lbnRzIG9mIDUteWVhci1vbGRzJyBtZW50YWwgY2FwYWNpdGllcz8KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fNjBtb19QQSA8LSBmYS5wYXJhbGxlbChkXzYwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fNjBtb19QQQpyZXRlbl82MG1vX3BhciA8LSByZXRlbl82MG1vX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhXzYwbW9fcGFyIDwtIGZhKGRfNjBtbywgbmZhY3RvcnMgPSByZXRlbl82MG1vX3Bhciwgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41fQpoZWF0bWFwX2Z1bihlZmFfNjBtb19wYXIpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiUGFyYWxsZWwgYW5hbHlzaXMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDUteWVhci1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzYwbW9fcGFyLCB0YXJnZXQgPSAiNS15ZWFyLW9sZHMiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuXzYwbW9fdnNzIDwtIFZTUyhkXzYwbW8sIHBsb3QgPSBGKTsgcmV0ZW5fNjBtb192c3MKcmV0ZW5fNjBtb19iaWMgPC0gZGF0YS5mcmFtZShyZXRlbl82MG1vX3ZzcyR2c3Muc3RhdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJuZmFjdG9ycyIpICU+JQogIHRvcF9uKC0xLCBCSUMpICU+JQogIHNlbGVjdChuZmFjdG9ycykpJG5mYWN0b3JzICU+JSBhcy5udW1lcmljKCkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfNjBtb19iaWMgPC0gZmEoZF82MG1vLCBuZmFjdG9ycyA9IHJldGVuXzYwbW9fYmljLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV82MG1vX2JpYykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJNaW5pbWl6aW5nIEJJQyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIikpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gNS15ZWFyLW9sZHM/CgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMn0KaXRlbXNwbG90X2Z1bihlZmFfNjBtb19iaWMsIHRhcmdldCA9ICI1LXllYXItb2xkcyIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl82MG1vX2sgPC0gcmV0ZW5fZnVuKGRfNjBtbywgcm90X3R5cGUgPSBjaG9zZW5fcm90KQpwcmludChwYXN0ZSgiUHJlc2V0IGNyaXRlcmlhIHN1Z2dlc3QgcmV0YWluaW5nIiwgcmV0ZW5fNjBtb19rLCAiZmFjdG9ycyIpKQpgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV82MG1vX2sgPC0gZmEoZF82MG1vLCBuZmFjdG9ycyA9IHJldGVuXzYwbW9faywgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNX0KaGVhdG1hcF9mdW4oZWZhXzYwbW9faykgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJQcmVzZXQgY3JpdGVyaWEgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIDUteWVhci1vbGRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDJ9Cml0ZW1zcGxvdF9mdW4oZWZhXzYwbW9faywgdGFyZ2V0ID0gIjUteWVhci1vbGRzIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhXG4oV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBTdWJzZXQgb2YgY2FwYWNpdGllcyBmcm9tIFdlaXNtYW4gZXQgYWwuICgyMDE3KQoKYGBge3J9CmRfYWxsX3dkbTIwMTcgPC0gZF9hbGwgJT4lCiAgc2VsZWN0KGJlaW5nX2F3YXJlX29mX3RoaW5ncywgZmVlbGluZ19jYWxtLCBmZWVsaW5nX2VtYmFycmFzc2VkLCAKICAgICAgICAgZmVlbGluZ19ndWlsdHksIGZlZWxpbmdfaGFwcHksIGZlZWxpbmdfbG92ZWQsIGZlZWxpbmdfcGFpbiwgCiAgICAgICAgIGZlZWxpbmdfcGxlYXN1cmUsIGZlZWxpbmdfcHJpZGUsIGZlZWxpbmdfc2FkLCBmZWVsaW5nX3NhZmUsIAogICAgICAgICBmZWVsaW5nX3NjYXJlZCwgZmVlbGluZ190aXJlZCwgZ2V0dGluZ19hbmdyeSwgZ2V0dGluZ19odW5ncnksIAogICAgICAgICBnZXR0aW5nX2h1cnRfZmVlbGluZ3MsIGhhdmluZ19nb2FscywgaGF2aW5nX3NlbGZfY29udHJvbCwgCiAgICAgICAgIGhhdmluZ190aG91Z2h0cywgaGF2aW5nX3dhbnRzX2FuZF9kZXNpcmVzLCBoZWFyaW5nX3NvdW5kcywgCiAgICAgICAgIG1ha2luZ19jaG9pY2VzLCBwbGFubmluZywgcmVhc29uaW5nX2Fib3V0X3RoaW5ncywgCiAgICAgICAgIHJlY29nbml6aW5nX290aGVyc19lbW90aW9ucywgcmVjb2duaXppbmdfc29tZWJvZHlfZWxzZSwgCiAgICAgICAgIHJlbWVtYmVyaW5nX3RoaW5ncywgc2VlaW5nLCB0ZWxsaW5nX3JpZ2h0X2Zyb21fd3JvbmcpCmBgYAoKYGBge3J9CmZhLnBhcmFsbGVsKGRfYWxsX3dkbTIwMTcpCmBgYAoKYGBge3J9ClZTUyhkX2FsbF93ZG0yMDE3LCByb3RhdGUgPSAidmFyaW1heCIpCmBgYAoKYGBge3J9CnJldGVuX2Z1bihkX2FsbF93ZG0yMDE3LCAidmFyaW1heCIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjh9CmZhKGRfYWxsX3dkbTIwMTcsIDMsICJ2YXJpbWF4IikgJT4lIGhlYXRtYXBfZnVuKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOH0KZmEoZF9hbGxfd2RtMjAxNywgMiwgInZhcmltYXgiKSAlPiUgaGVhdG1hcF9mdW4oKQpgYGAKCgojIERlbW9ncmFwaGljcwoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRHVyYXRpb24vNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kRHVyYXRpb24vNjApLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJEdXJhdGlvbiBvZiBzdHVkeSAoYWNjb3JkaW5nIHRvIFF1YWx0cmljcykiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJEdXJhdGlvbiAoaW4gbWludXRlcykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIER1cmF0aW9uKSAlPiUKICBtdXRhdGUoRHVyYXRpb24gPSBEdXJhdGlvbi82MCkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihEdXJhdGlvbiksCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKER1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKER1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtaW4gPSBtaW4oRHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1heCA9IG1heChEdXJhdGlvbiwgbmEucm0gPSBUKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBBZ2UpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kQWdlKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCA0KSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgYWdlIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIkFnZSAoaW4geWVhcnMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBBZ2UpICU+JQogIHN1bW1hcmlzZShtZWRpYW4gPSBtZWRpYW4oQWdlKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWluID0gbWluKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEFnZSwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmVmYV9hbGxfcGFyX3Njb3JlcyAlPiUKICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkgJT4lCiAgbGVmdF9qb2luKGRfZGVtbyAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoUmVzcG9uc2VJZCwgQWdlKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKFJlc3BvbnNlSWQgPSBhcy5jaGFyYWN0ZXIoUmVzcG9uc2VJZCkpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IEFnZSwgeSA9IHNjb3JlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBmYWNldF9ncmlkKGZhY3RvciB+IHRhcmdldCwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX3BvaW50KGFscGhhID0gMC4wNSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEdlbmRlclNleCkpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBnZW5kZXIvc2V4IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkdlbmRlci9zZXgiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEdlbmRlclNleCkgJT4lCiAgY291bnQoR2VuZGVyU2V4KSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBHZW5kZXJTZXgpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIGZpbHRlcihHZW5kZXJTZXggJWluJSBjKCJGZW1hbGUiLCAiTWFsZSIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IEdlbmRlclNleCwgeSA9IHNjb3JlKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yIH4gdGFyZ2V0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgIyBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDUsIGhlaWdodCA9IDApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIAogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHRhcmdldCwgZmFjdG9yLCBHZW5kZXJTZXgpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCBSYWNlRXRobmljaXR5X2NvbGxhcHNlKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCByYWNlL2V0aG5pY2l0eSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJSYWNlL2V0aG5pY2l0eSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSkgJT4lCiAgY291bnQoUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSkgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkgJT4lCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEZpcnN0TGFuZykpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBmaXJzdCBsYW5ndWFnZSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJMYW5ndWFnZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgRmlyc3RMYW5nKSAlPiUKICBjb3VudChGaXJzdExhbmcpICU+JQogIG11dGF0ZShwcm9wID0gcm91bmQobi9zdW0obiwgbmEucm0gPSBUKSwgMikpICU+JQogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBmYWN0b3IoRWR1Y2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBsZXZlbHMoZCRFZHVjYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGQkRWR1Y2F0aW9uKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiSGlnaGVzdCBsZXZlbCBvZiBlZHVjYXRpb24gY29tcGxldGVkIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBFZHVjYXRpb24pICU+JQogIGNvdW50KEVkdWNhdGlvbikgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmVmYV9hbGxfcGFyX3Njb3JlcyAlPiUKICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkgJT4lCiAgbGVmdF9qb2luKGRfZGVtbyAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoUmVzcG9uc2VJZCwgRWR1Y2F0aW9uKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKFJlc3BvbnNlSWQgPSBhcy5jaGFyYWN0ZXIoUmVzcG9uc2VJZCkpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk1SMSIsICJNUjMiLCAiTVIyIiwgIk1SNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29nbml0aW9uICYgY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgJiBzb2NpYWwgZW1vdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgZW1vdGlvbnMiKSksCiAgICAgICAgIGhpX2xvd19lZCA9IGNhc2Vfd2hlbigKICAgICAgICAgICBhcy5udW1lcmljKEVkdWNhdGlvbikgPCA4IH4gImxlc3MgdGhhbiBCQSIsCiAgICAgICAgICAgYXMubnVtZXJpYyhFZHVjYXRpb24pID49IDggfiAiQkEgb3IgbW9yZSIpLAogICAgICAgICBoaV9sb3dfZWQgPSBmYWN0b3IoaGlfbG93X2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID1jKCJsZXNzIHRoYW4gQkEiLCAiQkEgb3IgbW9yZSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaGlfbG93X2VkLCB5ID0gc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3IgfiB0YXJnZXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICAjIGdlb21faml0dGVyKGFscGhhID0gMC4wNSwgaGVpZ2h0ID0gMCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkodGFyZ2V0LCBmYWN0b3IsIGhpX2xvd19lZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAic2NvcmUiKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAxLCBjb2xvciA9ICJibHVlIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSW5jb21lKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBpbmNvbWUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiQW5udWFsIGhvdXNlaG9sZCBpbmNvbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEluY29tZSkgJT4lCiAgY291bnQoSW5jb21lKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBJbmNvbWUpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTVIxIiwgIk1SMyIsICJNUjIiLCAiTVI0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb2duaXRpb24gJiBjb250cm9sIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZSAmIHNvY2lhbCBlbW90aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBlbW90aW9ucyIpKSwKICAgICAgICAgaGlfbG93X2luYyA9IGNhc2Vfd2hlbigKICAgICAgICAgICBhcy5udW1lcmljKEluY29tZSkgPCA0IH4gImxlc3MgdGhhbiAkNjAsMDAxIiwKICAgICAgICAgICBhcy5udW1lcmljKEluY29tZSkgPj0gNCB+ICIkNjAsMDAxIG9yIG1vcmUiKSwKICAgICAgICAgaGlfbG93X2luYyA9IGZhY3RvcihoaV9sb3dfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9YygibGVzcyB0aGFuICQ2MCwwMDEiLCAiJDYwLDAwMSBvciBtb3JlIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGhpX2xvd19pbmMpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBoaV9sb3dfaW5jLCB5ID0gc2NvcmUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3IgfiB0YXJnZXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICAjIGdlb21faml0dGVyKGFscGhhID0gMC4wNSwgaGVpZ2h0ID0gMCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkodGFyZ2V0LCBmYWN0b3IsIGhpX2xvd19pbmMpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInNjb3JlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMSwgY29sb3IgPSAiYmx1ZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDEpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEhvdXNlaG9sZFNpemUpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kSG91c2Vob2xkU2l6ZSksIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBzaXplIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gaG91c2Vob2xkIChhZHVsdHMgYW5kIGNoaWxkcmVuKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgSG91c2Vob2xkU2l6ZSkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihIb3VzZWhvbGRTaXplKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2QgPSBzZChIb3VzZWhvbGRTaXplLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtaW4gPSBtaW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEhvdXNlaG9sZFNpemUsIG5hLnJtID0gVCkpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBtYXJpdGFsIHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJNYXJpdGFsIHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgTWFyaXRhbFN0YXR1cykgJT4lCiAgY291bnQoTWFyaXRhbFN0YXR1cykgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBQYXJlbnQpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgcGFyZW50IHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiJ05BJyBpbmRpY2F0ZXMgcmVzcG9uc2Ugb2YgJ1ByZWZlciBub3QgdG8gc2F5JyIsCiAgICAgICB4ID0gIlBhcmVudCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIFBhcmVudCkgJT4lCiAgY291bnQoUGFyZW50KSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZWZhX2FsbF9wYXJfc2NvcmVzICU+JQogIG11dGF0ZShSZXNwb25zZUlkID0gYXMuY2hhcmFjdGVyKFJlc3BvbnNlSWQpKSAlPiUKICBsZWZ0X2pvaW4oZF9kZW1vICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChSZXNwb25zZUlkLCBQYXJlbnQpICU+JSAKICAgICAgICAgICAgICBtdXRhdGUoUmVzcG9uc2VJZCA9IGFzLmNoYXJhY3RlcihSZXNwb25zZUlkKSkpICU+JQogIGZpbHRlcighaXMubmEoUGFyZW50KSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNUjEiLCAiTVIzIiwgIk1SMiIsICJNUjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvZ25pdGlvbiAmIGNvbnRyb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aXZlICYgc29jaWFsIGVtb3Rpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGVtb3Rpb25zIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQYXJlbnQsIHkgPSBzY29yZSkpICsKICBmYWNldF9ncmlkKGZhY3RvciB+IHRhcmdldCwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogICMgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjA1LCBoZWlnaHQgPSAwKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JSAKICAgICAgICAgICAgICAgICAgICBncm91cF9ieSh0YXJnZXQsIGZhY3RvciwgUGFyZW50KSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGZhdHRlbiA9IDEsIGNvbG9yID0gImJsdWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEwLCAxKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIGFlcyh4ID0gQ2hpbGRyZW5OdW1iZXIpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW9bZF9kZW1vJFBhcmVudCA9PSAiWWVzIixdJENoaWxkcmVuTnVtYmVyLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMSwgMTAwMDAsIDEpKSArCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8gJT4lIGZpbHRlcihQYXJlbnQgPT0gIlllcyIpLCAKICAgICAgIGFlcyh4ID0gZmFjdG9yKENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2RlbW8kQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UpKSkpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiQWdlIG9mIG9sZGVzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCBpbiB5ZWFycyAoYW1vbmcgcGFyZW50cykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbyAlPiUgZmlsdGVyKFBhcmVudCA9PSAiWWVzIiksIAogICAgICAgYWVzKHggPSBmYWN0b3IoQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkX2RlbW8kQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2RlbW8kQ2hpbGRyZW5Zb3VuZ2VzdEFnZV9jb2xsYXBzZSkpKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJBZ2Ugb2YgeW91bmdlc3QgY2hpbGQgYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBZ2Ugb2YgY2hpbGQgaW4geWVhcnMgKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKIyBTYXZlIEVGQSBvdXRwdXQKCkZpbmFsbHksIEknbGwgZXhwb3J0IHRoZSA0LWZhY3RvciBFRkEgcmVzdWx0cyB0byBhIHNhdmVkIGZpbGUgdGhhdCBJIGNhbiBkcmF3IG9uIGluIG91ciBTdHVkeSAyIGFuYWx5c2VzLgoKYGBge3J9CnNhdmVSRFMoZWZhX2FsbF9wYXIsIGZpbGUgPSAiLi9zMV9lZmEucmRzIikKd3JpdGUuY3N2KGRfZGVtbywgZmlsZSA9ICIuL3MxX2RlbW8uY3N2IikKd3JpdGUuY3N2KGRfYWxsLCBmaWxlID0gIi4vczFfZGF0YS5jc3YiKQpgYGAKCg==